# 导入外部数据
library("dplyr")

ReportCard1<-read_excel("ReportCard1.xlsx")
ReportCard2<-read_excel("ReportCard2.xlsx")

# 设置数据分析结果数据保留6位有效数字
options(digits = 6)

# 按照学号id字段合并ReportCard1和ReportCard2，并去掉重复列
ReportCard = merge(ReportCard1,ReportCard2,by = 'id')
ReportCard = ReportCard[,-6] #赋值索引法

#ReportCard按照phy字段进行降序排列
sort(ReportCard$phy,na.last = T,decreasing = T)
ord = order(ReportCard$phy,na.last = T,decreasing = T) # 返回索引顺序
ReportCard[ord,] # 按照索引顺序提取
arrange(ReportCard,phy)

# 查询ReportCard中存在缺失值的行
a = is.na(ReportCard$poli)
ReportCard[a,] #方法一
b = complete.cases(ReportCard) # 方法二：返回的是否是完整的
ReportCard[!b,]

# 异常值处理
# 方法一：删除法
# ReportCard = na.omit(ReportCard)
# 方法二：插补法(用该列均值)
ReportCard[is.na(ReportCard$poli),]$poli = mean(ReportCard$poli,na.rm = T)
ReportCard[which(ReportCard$chi<0),]$chi = NA
ReportCard[is.na(ReportCard$chi),]$chi = mean(ReportCard$chi,na.rm = T)
# 计算每位学生的平均成绩和总成绩
attach(ReportCard) #将列变为全局变量
sum = poli+chi+fore+phy
detach()
ave = sum/4
ReportCard$sum = sum
ReportCard$ave = ave
#将ReportCard中学生的成绩的平均成绩分为A,B,C,D,E 5个等级
# A：大于等于90分；
# B：大于等于80分，小于90分
# C：大于等于70分，小于80分
# D：大于等于60分，小于70分
# E：小于60分
# within函数:创建或修改数据框中的列
# 创建level = NA，则可以保留平均值，下面代码改为level[ave>=90] = 'A'，以此类推
ReportCard = within(ReportCard,{
  ave[ave>=90] = 'A'
  ave[ave>=80 & ave<=90] = 'B'
  ave[ave>=70 & ave<=80] = 'C'
  ave[ave>=60 & ave<=70] = 'D'
  ave[ave<=60] = 'E'
})
# 通过%in%包含函数;找出非正常项
flag = ReportCard$ave %in% c("D","E")
# 通过使用flag标记，将非正常的标记为Fall
# 选取 ReportCard$flag 中与逻辑向量 flag 中 TRUE 值对应的元素
ReportCard$flag[flag] = "Fall"
ReportCard$flag[!flag] = "Pass"
# 计算总分的中位数和上下四分位数
median(ReportCard$sum)
quantile(ReportCard$sum,c(.25,.5,.75))
# 将ReportCard中“gender”字段值1和2，替换成“M”和“F”
# “M”表示男性；“F”表示女性
# factor函数是将数值转换成因子
ReportCard$gender = factor(ReportCard$gender,levels = c(1,2),labels = c("M","F"))
# 对于ReportCard，筛选出性别为M，平均等级为C的样本
# 从数据框ReportCard中选择满足特定条件的行
New = subset(ReportCard,ReportCard$gender=="M"&ReportCard$ave=="C")
# 拆分学生的姓氏和姓名，分别存入LName和FName
# 拆分学生的姓氏和姓名，分别存入LName和FName
name = strsplit(ReportCard$name.x, " ")
# [i]根据索引返回一个对象（可能是子列表）;[[i]]从列表中根据索引返回索引对应的元素。
for (i in 1:nrow(ReportCard)) {
  ReportCard$Lnam
}
